package org.telegram.bot.handle;

import com.ruoyi.common.core.delay.IDelayEvent;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import org.telegram.bot.base.BotRegisterApplication;
import org.telegram.bot.domain.BotGroup;
import org.telegram.bot.domain.BotInfo;
import org.telegram.bot.domain.BotMessage;
import org.telegram.bot.emums.BotCacheConstants;
import org.telegram.bot.emums.BotExceptionEnums;
import org.telegram.bot.service.impl.DelayDeleteBotMessageImpl;
import org.telegram.telegrambots.meta.api.methods.botapimethods.BotApiMethod;
import org.telegram.telegrambots.meta.api.objects.message.Message;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

import java.io.Serializable;
import java.util.Date;

/**
 * 机器人发送消息接口，定义了同步和异步发送消息的方法，以及带有定时删除功能的同步消息发送方法
 * @author wyx
 * @date 2024-11-10 09:33:35
 */
public interface IBotSendMessage {
    
    /**
     * 获取机器人信息
     * @param botId 机器人标识
     * @return 机器人信息对象
     */
    default BotInfo getBotInfo(String botId){
        return BotRegisterApplication.getBotInfo(botId);
    }
    
    /**
     * 获取群组信息
     * @param chatId 群组聊天标识
     * @return 群组信息对象
     */
    default BotGroup getGroupInfo(Long chatId){
        return SpringUtils.getBean(RedisCache.class).getCacheObject(BotCacheConstants.BOT_CHAT+chatId);
    }
    
    /**
     * 同步发送消息
     * @param botId 机器人标识
     * @param method 消息发送方法
     * @return 发送消息的响应
     * @param <T> 响应类型
     * @param <Method> 发送方法类型
     */
    default <T extends Serializable, Method extends BotApiMethod<T>> T send(String botId, Method method){
        try {
            return getBotInfo(botId).getBot().execute(method);
        } catch (TelegramApiException e) {
            String explain = BotExceptionEnums.getExplain(e.getMessage());
            if(StringUtils.isNotEmpty(explain)){
                throw new ServiceException(explain);
            }else{
                throw new RuntimeException(e);
            }
        }
    };
    
    /**
     * 异步发送消息
     * @param botId 机器人标识
     * @param method 消息发送方法
     * @param <T> 响应类型
     * @param <Method> 发送方法类型
     */
    default <T extends Serializable, Method extends BotApiMethod<T>> void sendAsync(String botId, Method method){
        try {
            getBotInfo(botId).getBot().executeAsync(method);
        } catch (TelegramApiException e) {
            String explain = BotExceptionEnums.getExplain(e.getMessage());
            if(StringUtils.isNotEmpty(explain)){
                throw new ServiceException(explain);
            }else{
                throw new RuntimeException(e);
            }
        }
    }
    
    /**
     * 同步发送消息，并定时删除
     * @param botId 机器人标识
     * @param method 消息发送方法
     * @param timeout 消息存活时间，单位秒
     * @return 发送消息的响应
     * @param <T> 响应类型
     * @param <Method> 发送方法类型
     */
   default  <T extends Serializable, Method extends BotApiMethod<T>> T send(String botId,Method method,Long timeout){
        T res = send(botId,method);
        if(res!=null){
            Message message = (Message)res;
            BotMessage botMessage = new BotMessage();
            botMessage.setMessageId(message.getMessageId());
            botMessage.setId(System.currentTimeMillis());
            botMessage.setBotId(botId);
            botMessage.setTimeout(timeout);
            botMessage.setCreateTime(new Date());
            botMessage.setChatId(message.getChatId());
            IDelayEvent<BotMessage> delayEvent = SpringUtils.getBean(DelayDeleteBotMessageImpl.class);
            delayEvent.addToDelayQueue(botMessage);
        }
        return res;
    };
}
